package cn.jnetty.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 猪哥亮
 * @email 1030681978@qq.com
 * @date 2020/6/30 10:30
 * 描述：查找指定路劲下的文件并拷贝到制定文件夹下
 */
public class JnettyFileFindUtil {
    private static final Logger log = LoggerFactory.getLogger(JnettyFileFindUtil.class);
    /**
     * @param findPath   在哪个目录下查找 C:\Users\yatun\Desktop\BaseApk\base(3)\assets\res\raw-assets
     * @param createPath 在哪个目录下生成新文件 C:\\Users\\yatun\\Desktop\\BaseApk\\base(3)\\assets\\res\\pngs\\"
     */
    public static void find(String findPath, String createPath, String filePostfix) {
        List<File> files = searchFiles(new File(findPath), filePostfix);
        log.info("共找到:" + files.size() + "个文件");
        int i = 0;
        for (File file : files) {
            log.info(file.getName());
            try {
                File of = new File(createPath + (++i) + "." + filePostfix);
                if (!of.exists()) {
                    of.createNewFile();
                }
                try (FileChannel fis = new FileInputStream(file).getChannel(); FileChannel out = new FileOutputStream(of).getChannel()) {
                    out.transferFrom(fis, 0, fis.size());
                } catch (Exception e) {
                    log.error("",e);
                }
            } catch (IOException e) {
                log.error("",e);
            }
        }
    }

    private static List<File> searchFiles(File folder, final String keyword) {
        List<File> result = new ArrayList<>();
        if (folder.isFile()) {
            result.add(folder);
        }
        File[] subFolders = folder.listFiles(file -> {
            if (file.isDirectory()) {
                return true;
            }
            if (file.getName().toLowerCase().endsWith(keyword)) {
                return true;
            }
            return false;
        });
        if (subFolders != null) {
            for (File file : subFolders) {
                if (file.isFile()) {
                    // 如果是文件则将文件添加到结果列表中
                    result.add(file);
                } else {
                    // 如果是文件夹，则递归调用本方法，然后把所有的文件加到结果列表中
                    result.addAll(searchFiles(file, keyword));
                }
            }
        }
        return result;
    }
}
